<?php
/**
 * Redis 管理类
 * User: yuanji
 * Date: 2018/8/16
 * Time: 16:01
 */

namespace Lib;


class Redis extends \Redis{
    protected static $instances = array();//redis连接对象
    protected static $_config = array(
        'server' => '127.0.0.1',//服务器地址
        'port' => 6379,//端口地址
        'timeout' => 0.0,//超时时间
        'dbindex' => 0,//数据库名称(默认使用0这个数据库)
        'username' => '',//数据库用户名
        'password' => '',//数据库密码
        'pconnect' => true,//是否启用长连接
        'auth_pass' => '',//验证密码（redis配置密码模式时需要这个参数）
    );
    protected static $configs = array();//所有使用过的连接配置

    /**
     * 创建Redis对象，并使用对应的配置连接服务
     * @param null $dbindex         需要操作的数据库。默认使用配置文件里面设置的
     * @param string $config_name   选用不同的连接配置文件。
     */
    public function __construct($dbindex = NULL, $config_name = 'default') {
        parent::__construct();
        //self::$configs[$config_name] = $redis_config = self::$_config;//Config::getField('redis', $config_name, self::$_config);
        self::$configs[$config_name] = $redis_config = Config::ini('redis',self::$_config);
        if ($redis_config['pconnect']) { //是否使用长连接
            $this->pconnect($redis_config['server'], $redis_config['port'], $redis_config['timeout'], $config_name);
            $this->auth($redis_config['auth_pass']);
        } else {
            $this->connect($redis_config['server'], $redis_config['port'], $redis_config['timeout']);
            $this->auth($redis_config['auth_pass']);
        }
        $this->setOption(\Redis::OPT_SERIALIZER, \Redis::SERIALIZER_NONE);
        //self::$instances[$config_name] = $redis;

        $this->select($dbindex === NULL ? intval(@$redis_config['dbindex']) : $dbindex);//选择库
        self::$instances[$config_name] = $this;
    }

    /**
     * 手动关闭链接
     * @param array $names
     * @return bool
     */
    public static function closeInstance(array $names = array()){
        if (empty(self::$instances)) {
            return true;
        }
        if (empty($names)) {
            foreach (self::$instances as $name => $redis) {
                if (self::$configs[$name]['pconnect']) {
                    continue;
                }
                $redis->close();
                //unset(self::$configs[$name]);
            }
        } else {
            foreach ($names as $name) {
                if (isset(self::$instances[$name])) {
                    if (self::$configs[$name]['pconnect']) {#长连接不关闭
                        continue;
                    }
                    self::$instances[$name]->close();
                    //unset(self::$configs[$name]);
                }
            }
        }
        return true;
    }
}